home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
general
/
modelers
/
geomview
/
source.lha
/
Geomview
/
src
/
bin
/
trigrp
/
vec4.h
< prev
Wrap
C/C++ Source or Header
|
1992-08-31
|
3KB
|
120 lines
#include <math.h>
typedef double point4[4];
typedef double plane4[4];
typedef double matrix4[4][4];
#define ABS(aaa) (( (aaa) > 0) ? (aaa) : -(aaa))
#define VDOT3(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2])
#define INPRO31(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3])
#define INPRO4(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3])
#define MAGNITUDE3(v0) (sqrt (VDOT3(v0, v0)))
#define MAGNITUDE31(v0) (sqrt (ABS (INPRO31(v0, v0))))
#define MAGNITUDE4(v0) (sqrt (INPRO4(v0, v0)))
#define PROJECT4(v0) \
{float d = v0[3]; \
if (d) { \
d = 1.0/d; \
v0[0] = v0[0] * d; \
v0[1] = v0[1] * d; \
v0[2] = v0[2] * d; \
v0[3] = 1.0; }}
#define NORMALIZE3(v0) \
{double xxx; \
if (xxx = MAGNITUDE3(v0)) \
{v0[0] /= xxx; v0[1] /= xxx; v0[2] /= xxx; } }
#define NORMALIZE31(v) \
{double tmp = INPRO31(v,v); \
if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }}
#define VPRINT3(name,v) printf("name\t%f %f %f\n",v[0],v[1],v[2]);
#define VPRINT4(name,v) printf("name\t%f %f %f %f %f\n",v[0],v[1],v[2],v[3]);
#define VADD3(v0,v1,v2) \
{v2[0] = v0[0] + v1[0]; \
v2[1] = v0[1] + v1[1]; \
v2[2] = v0[2] + v1[2]; \
v2[3] = 1.0; }
#define VADD4(v0,v1,v2) \
{v2[0] = v0[0] + v1[0]; \
v2[1] = v0[1] + v1[1]; \
v2[2] = v0[2] + v1[2]; \
v2[3] = v0[3] + v1[3]; }
#define VSUB3(v0,v1,v2) \
{v2[0] = v0[0] - v1[0]; \
v2[1] = v0[1] - v1[1]; \
v2[2] = v0[2] - v1[2]; \
v2[3] = 1.0;}
#define VSUB4(v0,v1,v2) \
{v2[0] = v0[0] - v1[0]; \
v2[1] = v0[1] - v1[1]; \
v2[2] = v0[2] - v1[2]; \
v2[3] = v0[3] - v1[3];}
#define MIDPOINT4(v0,v1,v2) \
{v2[0] = (v0[0] + v1[0])/2.0; \
v2[1] = (v0[1] + v1[1])/2.0; \
v2[2] = (v0[2] + v1[2])/2.0; \
v2[3] = (v0[3] + v1[3])/2.0; }
#define VISZERO4(v) (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0)
#define MIDPOINT31(v0,v1,v2) \
{float m00, m11, a,v3[4]; \
VSUB4(v0, v1, v3); \
if (VISZERO4(v3)) \
VCOPY4(v0,v2) \
else { \
m00 = INPRO31(v0,v3); \
m11 = INPRO31(v1,v3); \
v2[0] = m11*v0[0] - m00*v1[0]; \
v2[1] = m11*v0[1] - m00*v1[1]; \
v2[2] = m11*v0[2] - m00*v1[2]; \
v2[3] = m11*v0[3] - m00*v1[3]; }}
#define XPRO3(v0,v1,v2) \
{v2[0] = v0[1]*v1[2] - v0[2]*v1[1]; \
v2[1] = v0[2]*v1[0] - v0[0]*v1[2]; \
v2[2] = v0[0]*v1[1] - v0[1]*v1[0]; }
#define VSCALE3(v0, s, v1) \
{v1[0] = s * v0[0]; \
v1[1] = s * v0[1]; \
v1[2] = s * v0[2]; }
#define VSCALE4(v0, s, v1) \
{v1[0] = s * v0[0]; \
v1[1] = s * v0[1]; \
v1[2] = s * v0[2]; \
v1[3] = s * v0[3]; }
#define VCOPY3(v0, v1) \
{v1[0] = v0[0]; \
v1[1] = v0[1]; \
v1[2] = v0[2]; }
#define VCOPY4(v0, v1) \
{v1[0] = v0[0]; \
v1[1] = v0[1]; \
v1[2] = v0[2]; \
v1[3] = v0[3];}
#define VZERO3(v0) \
{v0[0] = 0; \
v0[1] = 0; \
v0[2] = 0; \
v0[3] = 1.0; }
#define COPYMAT4(m1, m2) \
bcopy(m1, m2, (sizeof(double) * 16));